#pragma once

/**
 * @copyright Copyright (c) 2025 
 * CSG Digital Grid Technology (Guangdong) Co., Ltd.
 * @author zhouyan
 * @brief iec101数据定义
*/
#include "xtTypes.h"
namespace XIEC {
#pragma  pack (push,1)
    enum ResetCmdType {
        CMD_RESET_LINK,
        CMD_RESET_USER_PROCESS
    };
    enum SinglePointStatus {
        SP_OFF,
        SP_ON
    };
    enum DoublePointStatus {
        DP_ILLEGAL_00,
        DP_OFF,
        DP_ON,
        DP_ILLEGAL_11,
    };
    enum StepOperMethod {
        STEP_MINUS = 1,
        STEP_ADD
    };
    struct CP16Time2a {
        xuint16 ms;
    };
    struct CP24Time2a {
        xuint16 ms;
        xuint8 minute;
    };
    struct CP56Time2a {
        xuint16 ms;
        xuint8  minute;
        xuint8  hour;
        xuint8  day : 4;
        xuint8  week : 4;
        xuint8  month;
        xuint8  year;
    };
    union VSQ {
        struct{
            xuint8 cnt : 7;
            xuint8 SQ : 1;
        };
        xuint8 d;
        VSQ(xuint8 cnt = 0, xuint8 sq = 0)  {this->cnt = cnt; this->SQ = sq;}
    };
    enum COT {
        COT_UNUSED,
        COT_CYC,
        COT_BACK,
        COT_SPONT,
        COT_INIT,
        COT_REQ,
        COT_ACT,
        COT_ACT_CONFIRM,
        COT_DEACT,
        COT_DEACT_CONFIRM,
        COT_ACT_TERMINAL,
        COT_RET_REMOTE,
        COT_RET_LOCAL,
        COT_FILE,
        COT_INTRO_GEN   = 20,
        COT_INTRO_GROUP1,
        COT_REQCO_GEN = 37,
        COT_REQCO_GRUOP1,
        COT_UNKNOW_TYPEID = 44,
        COT_UNKNOW_COT,
        COT_UNKNOW_APP_SERVER_ADDR,
        COT_UNKNOW_INFO_OBJECT_ADDR
    };
    union SIQ {
        struct {
            xuint8 SPI : 1;
            xuint8 RES : 3;
            xuint8 BL : 1;
            xuint8 SB : 1;
            xuint8 NT : 1;
            xuint8 IV : 1;
        };
        xuint8 d;
        SIQ() : d(0) {}
        bool valid(void) const {
            return !(this->BL||this->SB||this->NT||this->IV);
        }
    };
    union DIQ {
        struct {
            xuint8 DPI : 2;
            xuint8 RES : 2;
            xuint8 BL : 1;
            xuint8 SB : 1;
            xuint8 NT : 1;
            xuint8 IV : 1;
        };
        xuint8 d;
        DIQ() : d(0) {}
        bool valid(void) const {
            return !(this->BL||this->SB||this->NT||this->IV);
        }
    };
    union QDS {
        struct {
            xuint8 OV : 1;
            xuint8 RES : 3;
            xuint8 BL : 1;
            xuint8 SB : 1;
            xuint8 NT : 1;
            xuint8 IV : 1;
        };
        xuint8 d;
        QDS() : d(0) {}
        bool valid(void) const {
            return !(this->BL||this->SB||this->NT||this->IV);
        }
    };
    struct BitString {
        xuint32 bs;
    };
    union QDP {
        struct {
            xuint8 RES : 3;
            xuint8 EI : 1;
            xuint8 BL : 1;
            xuint8 SB : 1;
            xuint8 NT : 1;
            xuint8 IV : 1;
        };
        xuint8 d;

        QDP() : d(0) {}
    };
    union VTI {
        struct {
            xuint8 val : 7;
            xuint8 Transient : 1;
        };
        xuint8 d;
    };
    union NVA {
        xuint16 value;
    };
    union SVA {
        xint16 value;
    };
    struct shortFloat {
        float value;
    };
    struct BCR {
        xuint32 value;
        struct {
            xuint8 SQ : 5;
            xuint8 CY : 1;
            xuint8 CA : 1;
            xuint8 IV : 1;
        }status;
        BCR(xuint32 value = 0) {this->value = value; status.SQ = 0; status.CY = 0; status.CA = 0; status.IV = 0;}
    };
    union SEP {
        struct {
            xuint8 ES : 2;
            xuint8 RES : 1;
            xuint8 EI : 1;
            xuint8 BL : 1;
            xuint8 SB : 1;
            xuint8 NT : 1;
            xuint8 IV : 1;
        };
        xuint8 d;
        SEP() : d(0) {}
    };
    union SPE {
        struct {
            xuint8 GS : 1;
            xuint8 SL1 : 1;
            xuint8 SL2 : 1;
            xuint8 SL3 : 1;
            xuint8 SLE : 1;
            xuint8 SRD : 1;
            xuint8 RES : 2;
        };
        xuint8 d;
        SPE() : d(0) {}
    };
    union OCI {
        struct {
            xuint8 GC : 1;
            xuint8 CL1 : 1;
            xuint8 CL2 : 1;
            xuint8 CL3 : 1;
            xuint8 RES : 4;
        };
        xuint8 d;

        OCI() : d(0) {}
    };
    struct FBP {
        xuint16 d;
        FBP() : d(0x55AA) {}
    };
    union SCO {
        struct {
            xuint8 SCS : 1;
            xuint8 RES : 1;
            xuint8 QU : 5;
            xuint8 SE : 1;
        };
        xuint8 d;
        SCO() : d(0) {}
    };
    union DCO {
        struct {
            xuint8 DCS : 2;
            xuint8 QU : 5;
            xuint8 SE : 1;
        };
        xuint8 d;
    };
    union RCO {
        struct {
            xuint8 RCS : 2;
            xuint8 QU : 5;
            xuint8 SE : 1;
        };
        xuint8 d;

        RCO() : d(0) {}
    };
    union COI {
        struct {
            xuint8 coi : 7;
            xuint8 LPC : 1;
        };
        xuint8 d;
    };
    struct QOI {
        xuint8 qoi;
    };
    union QCC {
        struct {
            xuint8 RQT : 6;
            xuint8 FRZ : 2;
        };
        xuint8 d;
    };
    union QPM {
        struct {
            xuint8 KPA : 6;
            xuint8 LPC : 1;
            xuint8 POP : 1;
        };
        xuint8 d;
    };
    struct QPA {
        xuint8 qpa;
    };
    struct QRP {
        xuint8 qrp;
    };
    union QOS {
        struct {
            xuint8 QL : 7;
            xuint8 SE : 1;
        };
        xuint8 d;

        QOS() : d(0) {}
    };
    union SCD {
        struct {
            xuint16 ST;
            xuint16 CT;
        };
        xuint32 d;
    };
#pragma pack(pop)
    struct Settings {
        xuint8 cot_len;
        xuint8 coa_len;
        xuint8 info_obj_addr_len;
    };
};
